package com.sky.mapper;

import com.github.pagehelper.Page;
import com.sky.dto.DataOverViewQueryDTO;
import com.sky.dto.GoodsSalesDTO;
import com.sky.dto.OrdersPageQueryDTO;
import com.sky.dto.OrdersRejectionDTO;
import com.sky.entity.Orders;
import com.sky.vo.BusinessDataVO;
import com.sky.vo.OrderOverViewVO;
import com.sky.vo.OrderStatisticsVO;
import com.sky.vo.OrderVO;
import io.swagger.models.auth.In;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

@Mapper
public interface OrderMapper {

    /**
     * 添加订单数据
     *
     * @param orders 订单对象
     */
    void insert(Orders orders);


    /**
     * 根据订单id删除订单
     *
     * @param id 订单id
     */
    @Delete("delete from orders where id = #{id}")
    void deleteById(Long id);

    /**
     * 查询订单详情
     *
     * @param id 订单id
     * @return orderVO
     */
    OrderVO selectWithDetailById(Long id);

    /**
     * 修改订单状态/支付状态
     *
     * @param id        订单id
     * @param status    订单状态
     * @param payStatus 支付状态
     */
    void updateByOrderId(Long id, Integer status, Integer payStatus);

    /**
     * 分页条件查询订单
     *
     * @param dto dto
     * @return page集合
     */
    Page<OrderVO> selectOrders(OrdersPageQueryDTO dto);

    /**
     * 各个状态的订单数量统计
     *
     * @return 数量统计
     */
    OrderStatisticsVO selectOrderStatusQuantityStatistics();


    /**
     * 根据订单id查询订单
     *
     * @param id 订单id
     * @return orders
     */
    @Select("select * from orders where id =#{id}")
    Orders selectById(Long id);

    /**
     * 更新订单信息
     *
     * @param orders 订单信息
     */
    void updateOrder(Orders orders);


    /**
     * 根据订单号查询订单
     *
     * @param number 订单号
     * @return 订单
     */
    @Select("select * from orders where number =#{number}")
    Orders selectByNumber(String number);

    /**
     * @param status 订单状态(1 待付款)
     * @param time   当前时间减去15分钟
     * @return 订单集合
     */
    List<Orders> getByStatusWithTimeLT(Integer status, LocalDateTime time);

    /**
     * 统计每天的营业额
     *
     * @param map map集合
     * @return 营业额
     */
    Double sumByMap(Map<String, Object> map);

    /**
     * 查询每日订单数
     *
     * @param map map
     * @return 订单数
     */
    Integer countByMap(Map<String, Object> map);

    /**
     * 根据时间范围查询销售前10的商品信息
     *
     * @param beginTime 开始时间
     * @param endTime   结束时间
     * @return
     */
    List<GoodsSalesDTO> getGoodNamesTop10(LocalDateTime beginTime, LocalDateTime endTime);

    /**
     * 查询订单管理数据(今天)
     *
     * @return vo
     */
    OrderOverViewVO getOverviewOrders(LocalDateTime begin, LocalDateTime end);
}
